원-핫 인코딩
원-핫 인코딩
개요
원- 인코딩(One-Hot)은 범주형 데이터(Categorical Data)를 기계학습 모델이 처리할 수 있도록 수치형 데이터로 변환하는 대표적인 인코딩 기법 하나입니다. 기학습 알고리즘은 일반적으로 숫자 형태의 입력만을 처리할 수 있기 때문에, 텍스트나 레이블 형태의 범주형 변수를 모델이 이해할 수 있는 형식으로 변환하는 과정이 필요합니다. 원-핫 인코딩은 이러한 변환 과정에서 가장 직관적이고 널리 사용되는 방법입니다.
이 문서에서는 원-핫 인코딩의 개념, 작동 원리, 장단점, 사용 사례, 그리고 구현 방법에 대해 상세히 설명합니다.
원-핫 인코딩의 개념
범주형 데이터란?
범주형 데이터는 특정 범주나 그룹에 속하는 값을 가지는 데이터를 말합니다. 예를 들어, 색상("빨강", "파랑", "초록"), 성별("남성", "여성"), 국가("한국", "미국", "일본") 등이 범주형 데이터에 해당합니다. 이러한 데이터는 순서가 없기 때문에 명목형 데이터(Nominal Data)라고도 합니다.
기계학습 모델은 이러한 문자열이나 레이블을 직접 처리할 수 없으므로, 수치화가 필요합니다. 원-핫 인코딩은 각 범주를 독립적인 이진 벡터(Binary Vector)로 표현함으로써 이 문제를 해결합니다.
인코딩 방식
원-핫 인코딩은 각 범주에 대해 하나의 새로운 열(Column)을 생성하고, 해당 범주에 속할 경우 그 열의 값은 1
, 나머지 열은 0
으로 설정합니다. 예를 들어, 색상 변수에 "빨강", "파랑", "초록" 세 가지 범주가 있다면 다음과 같이 변환됩니다:
색상 | 빨강 | 파랑 | 초록 |
---|---|---|---|
빨강 | 1 | 0 | 0 |
파랑 | 0 | 1 | 0 |
초록 | 0 | 0 | 1 |
이처럼 각 범주는 독립적인 이진 특성으로 표현되며, 모델은 각 범주가 다른 의미를 가진다는 것을 명확히 인식할 수 있습니다.
작동 원리
단계별 설명
- 범주 추출: 데이터에서 고유한 범주를 식별합니다.
- 더미 변수 생성: 각 범주마다 새로운 열을 생성합니다.
- 이진 값 할당: 각 샘플에 대해 해당 범주에 해당하는 열에
1
, 나머지에0
을 할당합니다.
예를 들어, 다음과 같은 데이터가 있다고 가정합니다:
동물 |
---|
고양이 |
개 |
고양이 |
새 |
원-핫 인코딩 후:
동물_고양이 | 동물_개 | 동물_새 |
---|---|---|
1 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
0 | 0 | 1 |
장점과 단점
장점
- 비대칭성 제거: 레이블 인코딩(Label Encoding)과 달리 숫자의 크기 관계를 부여하지 않아, 모델이 잘못된 순서 정보를 학습하는 것을 방지합니다.
- 해석 용이성: 각 범주가 독립적인 특성으로 표현되므로 모델의 해석이 용이합니다.
- 범용성: 대부분의 머신러닝 알고리즘(특히 선형 모델, 신경망 등)과 호환됩니다.
단점
- 차원 증가: 범주의 수가 많을수록 생성되는 열의 수가 증가하여, 차원의 저주(Curse of Dimensionality) 문제가 발생할 수 있습니다.
- 희소성: 대부분의 값이 0인 희소 행렬(Sparse Matrix)이 생성되어 메모리 사용량이 증가할 수 있습니다.
- 과적합 가능성: 특히 범주 수가 많고 샘플 수가 적은 경우, 모델이 훈련 데이터에 과적합될 위험이 있습니다.
사용 사례
원-핫 인코딩은 다음과 같은 상황에서 유용하게 사용됩니다:
- 분류 문제에서의 입력 변수 전처리 (예: 성별, 지역, 직업군 등)
- 신경망 입력층에 범주형 데이터 제공 시
- 회귀 모델에서 더미 변수로 활용 (예: 선형 회귀에서 지역 효과 분석)
하지만 순서가 있는 범주형 데이터(예: "낮음", "중간", "높음")의 경우, 원-핫 인코딩보다 순서형 인코딩(Ordinal Encoding)이 더 적절할 수 있습니다.
구현 방법 (Python 예시)
Python의 대표적인 데이터 처리 라이브러리인 [pandas](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/Python/pandas)
와 [scikit-learn](/doc/%EA%B8%B0%EC%88%A0/%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D/scikit-learn)
을 사용하여 원-핫 인코딩을 쉽게 구현할 수 있습니다.
1. Pandas 사용
import pandas as pd
data = pd.DataFrame({'color': ['red', 'blue', 'green', 'red']})
encoded_data = pd.get_dummies(data, columns=['color'])
print(encoded_data)
2. Scikit-learn
from sklearn.preprocessing import OneHotEncoder
import numpy as np
encoder = OneHotEncoder(sparse_output=False)
colors = np.array([['red'], ['blue'], ['green'], ['red']])
encoded = encoder.fit_transform(colors)
print(encoded)
print("Categories:", encoder.categories_)
관련 기법
- 레이블 인코딩(Label Encoding): 각 범주에 정수 값을 할당 (예: 빨강=0, 파랑=1). 순서가 없는 데이터에 사용 시 주의 필요.
- 임베딩(Embedding): 딥러닝에서 고차원 범주를 저차원 밀집 벡터로 표현. 차원 증가 문제 해결에 효과적.
- 베이스-N 인코딩(Base-N Encoding): 범주를 N진수로 인코딩. 원-핫보다 차원이 작음.
참고 자료
- Scikit-learn Documentation - Preprocessing
- Pandas get_dummies 함수 문서
- Bishop, C. M. (2006). Pattern Recognition and Machine Learning. Springer.
원-핫 인코딩은 데이터 과학에서 범주형 변수를 처리하는 기본적이면서도 핵심적인 기법입니다. 적절한 상황에서 사용하면 모델 성능 향상에 기여할 수 있으나, 범주의 수가 많은 경우에는 차원 축소 기법이나 임베딩과 함께 고려하는 것이 좋습니다.
이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.